/**
  * Author: Mei
  * Date: 2020-11-24 21:51
  * Description: forward() 函数的作用：保持住实参的类型。
  *
  */
#include <iostream>
#include <utility>

template<typename F, typename T1, typename T2>
void fcn2(F f, T1 &&t1, T2 &&t2) {
    //f(std::forward<T2>(t2), std::forward<T1>(t1));//OK
    //f(std::move(t2), std::forward<T1>(t1));//OK
    f(t2, t1);//ERROR
}

void f1(int &&i1, int &i2) {
    i1 = 10;
    i2 = 20;
}

int main() {
    int i1 = 1, i2 = 2;
    int &a = i1;
    int &b = i2;
    int &&c = 111;

    fcn2(f1, i1, 42);//因为42为右值，所以fcn2的T2为右值，如果不加forward，把T2的形参传给另一个函数时，它就变成了左值，但是函数f1的参数时右值，这时，编译就不过了。
    std::cout << i1 << ", " << i2 << std::endl;

}